/**
 * 导出工具函数
 * 提供将数据导出为CSV格式并触发下载的功能
 */

/**
 * 将对象数组转换为CSV格式的字符串
 * @param {Array} data - 要导出的数据数组
 * @param {Array} headers - 表头定义，格式为 [{label: '显示名', prop: '字段名'}]
 * @returns {String} CSV格式的字符串
 */
export function convertToCSV(data, headers) {
  if (!data || !data.length || !headers || !headers.length) {
    return '';
  }

  // 构建表头行
  const headerRow = headers.map(h => `"${h.label}"`).join(',');
  
  // 构建数据行
  const rows = data.map(item => {
    return headers.map(header => {
      const value = item[header.prop];
      // 处理null、undefined及包含逗号、引号的情况
      if (value === null || value === undefined) {
        return '""';
      }
      // 将值转换为字符串并用双引号包裹（避免CSV格式问题）
      return `"${String(value).replace(/"/g, '""')}"`;
    }).join(',');
  });
  
  // 合并表头和数据行
  return headerRow + '\n' + rows.join('\n');
}

/**
 * 触发文件下载
 * @param {String} content - 文件内容
 * @param {String} fileName - 文件名
 * @param {String} mimeType - MIME类型
 */
export function downloadFile(content, fileName, mimeType = 'text/csv;charset=utf-8;') {
  // 创建Blob对象
  const blob = new Blob([content], { type: mimeType });
  
  // 创建下载链接
  const link = document.createElement('a');
  
  // 使用URL.createObjectURL创建临时URL
  const url = URL.createObjectURL(blob);
  
  // 设置链接属性
  link.href = url;
  link.setAttribute('download', fileName);
  link.style.display = 'none';
  
  // 添加到DOM中并触发点击
  document.body.appendChild(link);
  link.click();
  
  // 清理：移除链接并释放URL
  setTimeout(() => {
    document.body.removeChild(link);
    URL.revokeObjectURL(url);
  }, 100);
}

/**
 * 导出数据为CSV文件并触发下载
 * @param {Array} data - 要导出的数据数组
 * @param {Array} headers - 表头定义，格式为 [{label: '显示名', prop: '字段名'}]
 * @param {String} fileName - 文件名(不含扩展名)
 */
export function exportToCSV(data, headers, fileName = 'export') {
  // 添加BOM以确保Excel正确识别中文
  const BOM = '\uFEFF';
  const csvContent = BOM + convertToCSV(data, headers);
  
  // 加上时间戳确保文件名唯一
  const timestamp = new Date().toISOString().replace(/[-:.]/g, '').substring(0, 14);
  const fullFileName = `${fileName}_${timestamp}.csv`;
  
  // 触发下载
  downloadFile(csvContent, fullFileName);
}

/**
 * 带有自动时间格式化功能的CSV导出
 * @param {Array} data - 要导出的数据数组
 * @param {Array} headers - 表头定义，格式为 [{label: '显示名', prop: '字段名', type: '类型'}]
 * @param {String} fileName - 文件名(不含扩展名)
 */
export function exportFormatted(data, headers, fileName = 'export') {
  // 创建一个格式化后的数据副本
  const formattedData = data.map(item => {
    const formatted = { ...item };
    
    // 处理不同类型的格式化
    headers.forEach(header => {
      if (header.type === 'datetime' && formatted[header.prop]) {
        // 确保日期时间格式统一
        try {
          const date = new Date(formatted[header.prop]);
          if (!isNaN(date)) {
            formatted[header.prop] = date.toLocaleString('zh-CN', {
              year: 'numeric',
              month: '2-digit',
              day: '2-digit',
              hour: '2-digit',
              minute: '2-digit',
              second: '2-digit',
              hour12: false
            });
          }
        } catch (e) {
          console.error('日期格式化错误:', e);
        }
      }
    });
    
    return formatted;
  });
  
  // 使用格式化后的数据导出
  exportToCSV(formattedData, headers, fileName);
} 